feat(assessors): add lint suppression density assessor - #518
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds a configurable ChangesLint suppression density
Sequence Diagram(s)sequenceDiagram
participant Repository
participant LanguageDetector
participant LintSuppressionAssessor
participant Git
participant Finding
Repository->>LanguageDetector: detect tracked repository languages
LanguageDetector-->>LintSuppressionAssessor: return applicable languages
LintSuppressionAssessor->>Git: list tracked source files
Git-->>LintSuppressionAssessor: return file inventory
LintSuppressionAssessor->>LintSuppressionAssessor: count suppressions and LOC
LintSuppressionAssessor->>Finding: return score, evidence, and remediation
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
f32905b to
3962946
Compare
📈 Test Coverage Report
Coverage calculated from unit tests only |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/attributes.md`:
- Line 6: Update the attribute counts in docs/attributes.md to match the weights
catalog: report 30 total attributes, 10 Tier 2 attributes, and 9 Tier 3
attributes. Adjust the affected summary and section text while leaving the
attribute definitions unchanged.
In `@src/agentready/assessors/code_quality.py`:
- Around line 2149-2161: Update the suppression assessor flow around
_count_file_suppressions to retain each file’s line count, rank file_stats by
suppressions divided by LOC rather than absolute counts, and use
calculate_proportional_score() for proportional scoring. Replace direct Finding
construction and manual score interpolation with Finding.create_pass() or
Finding.create_fail() while preserving the assessor’s existing pass/fail
criteria and output details.
- Around line 1943-1950: Update the JavaScript and TypeScript rule patterns in
the code-quality assessor to detect canonical block-form /* eslint-disable */
directives alongside existing line comments, while retaining `@ts-ignore`
detection. Add a regression test covering block-form ESLint suppression and
confirming it is counted.
In `@src/agentready/data/default-weights.yaml`:
- Around line 76-81: Update
CyclomaticComplexityAssessor.attribute.default_weight and
ArchitecturalBoundaryAssessor.attribute.default_weight from 0.02 to 0.01 so
assessor fallback values match the corresponding entries in
default-weights.yaml.
In `@src/agentready/models/config.py`:
- Around line 112-118: Add a typed LintSuppressionOptions model near the
configuration models and change assessor_options to use it instead of
unvalidated Any dictionaries. Configure strict boolean fields, finite
non-negative numeric thresholds, and validation requiring fail_per_kloc to
exceed pass_per_kloc, so invalid assessor settings are rejected during
configuration parsing.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Enterprise
Run ID: 007af8eb-0b73-4298-aec6-3d28976b37ae
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock,!uv.lock
📒 Files selected for processing (8)
.agentready-config.example.yamldocs/attributes.mdsrc/agentready/assessors/__init__.pysrc/agentready/assessors/code_quality.pysrc/agentready/data/.agentready-config.example.yamlsrc/agentready/data/default-weights.yamlsrc/agentready/models/config.pytests/unit/test_assessors_code_quality.py
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/agentready/assessors/code_quality.py`:
- Around line 2119-2127: Update the traversal loop around os.walk in the
relevant assessor to use the repository’s tracked, ignore-aware file inventory
instead of scanning every directory. Preserve the existing
_SUPPRESSION_EXCLUDED_DIRS filtering and filename matching for bare_names and
dot_exts, while retaining explicit generated/vendor exclusions and yielding the
same abs_path, rel_path pairs.
- Around line 2135-2140: Update the suppression-counting logic around the
lines-processing function to ignore directive text inside string literals,
including test fixtures and statements such as print calls. Tokenize comment
content or mask string literals before applying patterns, while preserving
counting of actual suppression directives in comments and the existing return
values.
- Around line 2096-2103: Update the JavaScript/TypeScript branch in the
test-file detection logic to recognize both JSX and TSX test/spec suffixes in
addition to JS and TS. Ensure exclude_tests correctly filters Component.test.jsx
and Component.spec.tsx while preserving the existing directory and root-prefix
checks.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Enterprise
Run ID: f728a4b2-731f-461b-b068-6702d5837e7c
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock,!uv.lock
📒 Files selected for processing (8)
.agentready-config.example.yamldocs/attributes.mdsrc/agentready/assessors/__init__.pysrc/agentready/assessors/code_quality.pysrc/agentready/data/.agentready-config.example.yamlsrc/agentready/data/default-weights.yamlsrc/agentready/models/config.pytests/unit/test_assessors_code_quality.py
5f9c4bb to
476098c
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (2)
src/agentready/assessors/code_quality.py (2)
2080-2087: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winExclude JSX and TSX test files.
Component.test.jsxandComponent.spec.tsxare scanned even whenexclude_tests=True. Derive suffixes from_LANG_EXTENSIONS[lang]and add regressions for both forms.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/agentready/assessors/code_quality.py` around lines 2080 - 2087, Update the test-file detection logic in the JavaScript/TypeScript branch to derive test suffixes from _LANG_EXTENSIONS[lang], covering JSX and TSX alongside JS and TS. Preserve the existing directory and root-prefix checks, and add regression coverage confirming Component.test.jsx and Component.spec.tsx are excluded when exclude_tests=True.
2159-2173: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winRank files by suppression concentration, not count.
A large file with more suppressions can outrank a small file with much higher density. Retain each file’s LOC and sort by
suppressions / LOC, as required by the feature objective.Also applies to: 2200-2207
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/agentready/assessors/code_quality.py` around lines 2159 - 2173, Update the suppression file-statistics flow around _count_file_suppressions to retain each file’s line count alongside its suppression count and rank files by suppression concentration (sup_count divided by line_count), rather than absolute suppression count. Apply the same change to the related statistics handling around the additional referenced section, while preserving existing test-file exclusion and zero-suppression behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/attributes.md`:
- Line 29: Update the attribute-count statements in docs/attributes.md to report
30 instead of 28, keeping them consistent with the 30-entry weights catalog and
the count stated on Line 6.
In `@src/agentready/models/config.py`:
- Around line 152-165: Unify lint-suppression configuration so the documented
assessor_options entry is not ignored: in src/agentready/models/config.py lines
152-165, expose one canonical path or validate/map the nested configuration into
LintSuppressionOptions; in src/agentready/assessors/code_quality.py lines
2061-2066, update the lint-suppression assessor to consume that canonical path
consistently; and in docs/attributes.md lines 1524-1532, document the same path
and configuration contract.
---
Duplicate comments:
In `@src/agentready/assessors/code_quality.py`:
- Around line 2080-2087: Update the test-file detection logic in the
JavaScript/TypeScript branch to derive test suffixes from
_LANG_EXTENSIONS[lang], covering JSX and TSX alongside JS and TS. Preserve the
existing directory and root-prefix checks, and add regression coverage
confirming Component.test.jsx and Component.spec.tsx are excluded when
exclude_tests=True.
- Around line 2159-2173: Update the suppression file-statistics flow around
_count_file_suppressions to retain each file’s line count alongside its
suppression count and rank files by suppression concentration (sup_count divided
by line_count), rather than absolute suppression count. Apply the same change to
the related statistics handling around the additional referenced section, while
preserving existing test-file exclusion and zero-suppression behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Enterprise
Run ID: 0dbc6cd0-9e24-414d-aaaa-db0f3f0c65ae
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock,!uv.lock
📒 Files selected for processing (9)
.agentready-config.example.yamldocs/attributes.mdsrc/agentready/assessors/__init__.pysrc/agentready/assessors/code_quality.pysrc/agentready/assessors/structure.pysrc/agentready/data/.agentready-config.example.yamlsrc/agentready/data/default-weights.yamlsrc/agentready/models/config.pytests/unit/test_assessors_code_quality.py
cf2229e to
47fe732
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/agentready/assessors/code_quality.py`:
- Around line 2068-2094: Update _is_test_file to apply the shared
_TEST_DIR_FRAGMENTS and _TEST_ROOT_PREFIXES checks for every supported language
before language-specific filename rules. Add Java handling and ensure Java files
under test directories are excluded, while preserving existing Go, Python,
JavaScript, TypeScript, and Ruby filename detection; extend tests to cover the
additional supported languages.
- Around line 2111-2137: Update the file-discovery logic around
safe_subprocess_run and the os.walk fallback so Git failures, missing Git, or
timeouts do not trigger ignore-unaware traversal. Instead, return the assessor’s
established skipped/error finding for unavailable discovery, or replace the
fallback with an ignore-aware mechanism while preserving normal git ls-files
behavior.
- Around line 1937-1953: Extend _SUPPRESSION_PATTERNS for Python to recognize
whole-file # ruff: noqa and # flake8: noqa directives, and for TypeScript to
recognize // `@ts-nocheck` and // `@ts-expect-error`. Add regression tests covering
each directive and confirming they contribute to suppression density.
- Around line 2121-2125: The source-file discovery loop should reject symlinks
and other non-regular files before yielding paths, and downstream assessment
reads must be bounded. Update the logic around the visible rel_path filtering
and its corresponding read path to validate regular files without following
symlinks, then stream each file with a strict maximum byte limit instead of
unbounded read_text().
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Enterprise
Run ID: fbd34c4b-2f0e-4211-8ac8-260ab1093670
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock,!uv.lock
📒 Files selected for processing (9)
.agentready-config.example.yamldocs/attributes.mdsrc/agentready/assessors/__init__.pysrc/agentready/assessors/code_quality.pysrc/agentready/assessors/structure.pysrc/agentready/data/.agentready-config.example.yamlsrc/agentready/data/default-weights.yamlsrc/agentready/models/config.pytests/unit/test_assessors_code_quality.py
|
Hi @jwm4, could you PTAL? |
🤖 AI-assisted review
Five specialist agents reviewed independently and converged on the same core defect from four different angles. Findings are deduplicated and ranked below. 🔴 Critical — merge blockers1. The branch breaks CI
Green on 2. Terraform and Dockerfile support is unreachable dead codeFound independently by all five agents.
Reproduced end-to-end on a repo containing 20 This is advertised in three user-facing places that are now false:
The tests certify the broken behavior. 3. Markdown/YAML in the denominator inverts the metric
Synthetic Go repo at a genuine 100 suppressions/1k lines, plus 24k lines of Markdown docs:
The score flips 0 → 100 purely because the project is documented — the exact inverse of the intended signal. On this repo the dilution is 3x (0.2/1k as shipped vs 0.6/1k Python-only). Compounding it: 4. Three silent-failure paths under-count the numerator while still reporting
|
| # | Finding | Location |
|---|---|---|
| 6 | All three threshold comparisons survive mutation. <=→< at :2210 and :2217, >=→> at :2212 each leave 63/63 green — no test sits on a boundary. A flip at :2217 silently converts every threshold-exact repo from pass to fail. Confirmed current behavior: density exactly 5.0 → pass/100, exactly 15.0 → fail/0. |
code_quality.py:2210-2217 |
| 7 | .mjs, .cjs, .pyi, .pyx, .zsh trigger language detection but are never scanned — _LANG_EXTENSIONS is a hand-maintained second copy of EXTENSION_MAP that has already drifted. An ESM-only JS repo scores 100 regardless of eslint-disable count. Also .mdx is in the assessor table but not the detector. |
code_quality.py:1972-1984 |
| 8 | Config.assessor_options is dead public schema — zero readers in src/, tests/, docs/, and absent from both example configs. It punches a hole in extra="forbid": config written under it validates cleanly and does nothing, which is strictly worse than the loud typo it would otherwise be. It also serializes into every report via assessment.py:128 while CURRENT_SCHEMA_VERSION stays 1.0.0. Config schemas are one-way doors. |
models/config.py:159 |
| 9 | Total measurement failure reports as not_applicable ("No source files found for supported languages") — on a repo the scanner just reported as 100% Go. Contradicts the scan and misdirects debugging. is_applicable() has already established the language is present. |
code_quality.py:2194 |
| 10 | The bare except Exception around git ls-files hardcodes "missing git, not a git repo, or timeout" — but the likeliest real trigger is SubprocessSecurityError from safe_subprocess_run's 10 MB stdout cap, which git ls-files clears on a ~200k-path monorepo. The user is told to install git, which is installed. safe_subprocess_run_stream already exists for exactly this. ("not a git repo" is near-unreachable — Repository.__post_init__ rejects those already.) |
code_quality.py:2124 |
| 11 | git ls-files is re-invoked once per detected language for identical output — 4 spawns on this repo, 9 on a polyglot monorepo, each with a 30s timeout. Hoist it out of the loop. |
code_quality.py:2116 |
| 12 | Attribute.criteria hardcodes _SUPPRESSION_DEFAULTS while Finding.threshold honors config → a repo setting pass_per_kloc: 10.0 gets one report containing both "≤5.0" and "≤10.0/1k". |
code_quality.py:2056 |
🔵 Suggestions
- The class docstring's "Other languages always include all files" (
:2029) is false —_TEST_DIR_FRAGMENTSis checked before the per-language branch, sotests/foo.shandspec/values.yamlare excluded. Only the filename-suffix heuristics are language-specific. docs/attributes.md:1504breaks house style — no**ID**/**Tier**/**Weight**/**Category**/**Status**block, no#### Definition/Why It Matters/Measurable Criteria, no**Tools**/**Citations**. Compare### Threat Modelimmediately above. The inline-(id, weight)heading format is the convention for the bullet lists, not for full###sections.- The example-config comment
exclude_tests: false # set true to exclude test files from LOC countdescribes the wrong effect — the flag skips files entirely (numerator and denominator). Opposite-signed from what someone tuning it would predict. TheLintSuppressionOptionsdocstring gets this right; the YAML comments contradict it. _MAX_SUPPRESSION_FILE_BYTES = 1_000_000 # 1 MiB— that's 1 MB. Same indocs/attributes.md:1510. Either say "1 MB" or use1 << 20.default-weights.yaml:12and:72still say Tier 3 has 8 attributes; it's 9. (Line 3 was correctly bumped to 30.)- The changelog block labels this
v2.5.0, butpyproject.tomlis at 2.50.0 andlint_config_coverage— labeledv2.4.0— actually shipped in 2.50.0. The version numbering in that block has drifted from real releases; consider keying entries by branch/issue instead. pass_per_klocusesgt=0, forbidding0.0— the legitimate strictest policy ("no suppressions tolerated").ge=0on pass,gt=0on fail._get_optionsunpacks the validated model intotuple[float, float, bool]— two positionally-adjacent floats of identical type, reintroducing the transposition hazard the validator exists to prevent. Return theLintSuppressionOptionsinstead.- Consider
frozen=TrueonLintSuppressionOptions: pydantic v2 doesn't re-runmode="after"validators on assignment, and_SUPPRESSION_DEFAULTSis a process-wide shared mutable instance.
✅ Strengths
- The security posture is genuinely strong. git-only discovery with a deliberate no-fallback policy (well-commented at
:2113— exactly the kind of "why" comment that stops a future maintainer from helpfully adding the fallback back),lstat+stat.S_ISREGsymlink rejection, bounded reads. Mutation probes confirmed the symlink and gitignore tests each catch their regression, and the symlink test's use of a gitignored target to isolate the behavior is well-judged. _GitInventoryUnavailableis the best-designed type in the diff — it cleanly separates "cannot measure" (skipped) from "measured zero" (not_applicable) from "bug" (error), and makes the no-silent-fallback decision greppable.- Weight arithmetic is correct: 30 attributes summing to exactly
1.0, tiers 58/27/13/2, and the new attribute is properly funded by reductions elsewhere. black,isort,ruff checkall clean. Line coverage of the new code is ~97%.- Assessor registration follows the
AGENTS.md4-step checklist correctly. - The custom two-threshold interpolation instead of
calculate_proportional_score()is a defensible deviation — the helper models a single threshold and can't express a pass/fail band.
Recommended sequence
- Fix the red test ([P0] Create Automated Demo #1) — unblocks CI.
- Decide Terraform/Dockerfile ([P0] Fix Critical Security & Logic Bugs from Code Review #2): add
.tf+ a filename rule toEXTENSION_MAP, or strip them from the pattern tables, theAttribute.description, the docs, and the two tests. Then add the guard that would have caught this pre-merge:def test_suppression_tables_agree_with_detector(): assert set(_SUPPRESSION_PATTERNS) == set(_LANG_EXTENSIONS) assert set(_SUPPRESSION_PATTERNS) <= set(LanguageDetector.EXTENSION_MAP.values())
- Fix the denominator ([P0] Bootstrap AgentReady Repository on GitHub #3): exclude Markdown/YAML from LOC (or report per-language), and stop counting blank lines. This is the change that most affects what the assessor actually measures.
- Make silent skips visible ([P0] Report Header with Repository Metadata #4): thread a scan-health tally (
files_missing,files_unreadable,files_truncated) through the walk, and emit it inevidenceunconditionally — on pass as well as fail. If the un-scanned ratio exceeds ~10%, downgrade toskippedrather than reporting a density at all. A density computed over an unknown fraction of the codebase isn't a measurement. - Derive
_LANG_EXTENSIONSfromEXTENSION_MAP([P4] Research Report Generator/Updater Utility #7) — structurally eliminates this entire drift class. - Drop
assessor_options([P4] Repomix Integration #8) — re-add it in the PR that first needs it, with a reader, a precedence rule, and a test. - Sync the two weight docs ([P0] Improve HTML Report Design (Font Size & Color Scheme) #5), add boundary tests ([P3] Report Schema Versioning #6), re-run.
The security-critical paths here were clearly thought about carefully, and the no-fallback discipline around git ls-files is a good instinct. The gap is that the measurement paths weren't held to the same standard: the language table was written without checking it against the detector, and several tests confirm the implementation's assumptions rather than the behavior users will get.
Posted by an AI agent (Claude Opus 4.6 via Claude Code, /pr-review-toolkit:review-pr). Findings are reproducible — please verify before acting, and correct anything that's wrong.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tests/unit/test_language_detector.py`:
- Around line 23-33: Rename test_bare_dockerfile_detected to reflect that a bare
Dockerfile below the reporting threshold is not reported, while preserving its
existing setup and assertion.
- Line 17: Update the four git staging subprocess.run calls in
test_language_detector.py and the corresponding staging call in
test_assessors_code_quality.py to pass an explicit check argument, matching the
existing _git_init convention; preserve their current commands and
capture_output behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: f8083bd5-512e-49a3-bcaa-1ed9fe8effad
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock,!uv.lock
📒 Files selected for processing (12)
.agentready-config.example.yamldocs/attributes.mdsrc/agentready/assessors/__init__.pysrc/agentready/assessors/code_quality.pysrc/agentready/assessors/structure.pysrc/agentready/data/.agentready-config.example.yamlsrc/agentready/data/default-weights.yamlsrc/agentready/models/config.pysrc/agentready/services/language_detector.pytests/unit/test_assessors_code_quality.pytests/unit/test_assessors_structure.pytests/unit/test_language_detector.py
Heavy use of suppression directives (//nolint, # noqa, eslint-disable, @SuppressWarnings, etc.) degrades lint as a quality signal for AI agents — lint passes, but not because the code is clean. New LintSuppressionAssessor (Tier 3, 2% weight) scans source files for suppression directives across 10 languages, normalized per 1,000 LOC: - ≤5/1k → score 100, pass - 5–15/1k → linear 100→0, fail - ≥15/1k → score 0, fail Thresholds and test-file exclusion are configurable via .agentready-config.yaml::assessor_options.lint_suppression_density. Closes ambient-code#510
|
Hmm, a very suspicious CI fail with 7k lines |
@msu8 ignore that, it was from a bad merge. I overlooked this CI failure from a different PR., I shall post a fix soon and you can rebase on your end. |
|
Got it. Anyway, I think I addressed both your review and the coderabbit stuff in the last two commits. |
|
🎉 This PR is included in version 2.52.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
Description
Add
LintSuppressionAssessorto detect overuse of lint suppression directivesacross the codebase. A repo can have a comprehensive lint config and still
render it meaningless through blanket
//nolint,# noqa, or// eslint-disableusage — lint passes, but not because the code is clean.This gives AI agents a false signal that the codebase is healthy.
Type of Change
Related Issues
Fixes #510
Changes Made
LintSuppressionAssessor(lint_suppression_density, Tier 3, 2% weight)//nolint), Python (# noqa,# type: ignore,# pylint: disable), JavaScript/TypeScript (// eslint-disable,// @ts-ignore), Ruby (# rubocop:disable), Java (@SuppressWarnings), Terraform (# tflint-ignore:), Shell (# shellcheck disable=), Dockerfile (# hadolint ignore=), YAML (# yamllint disable,# kube-linter disable), Markdown (<!-- markdownlint-disable -->).agentready-config.yaml::assessor_optionsvendor/,node_modules/, and other generated directories from scanningdocs/attributes.mdupdated with scoring rules, language coverage, and remediation examplesdefault-weights.yamlupdated (v2.5.0, 30 total attributes)code_quality.py— no separate moduleTesting
pytest)Manual test: assessed
psf/black(Python),golangci/golangci-lint(Go) and othersChecklist
Additional Notes
Summary by CodeRabbit